package com.wjw.java.others.innerClass_;

/**
 * 静态内部类:定义在外部类的成员位置,使用static修饰
 * 1.可以直接访问外部类的所有静态成员,包含私有的
 * 2.可以添加任意访问修饰符,因为它的地位就是一个成员
 * 3.作用域：和外部类的其他成员一样,为整个类体
 * 4.静态内部类访问外部类成员,直接访问static修饰的成员
 * 5.外部类访问静态内部类,先创建对象在访问
 * 6.外部其他类访问静态内部类,有二种
 *   一、外部类.静态内部类 变量名 = new 外部类.成员内部类();
 *   二、在外部类定义一个静态方法,返回静态内部类
 *
 * 7.如果外部类和成员内部类的成员重名时,默认遵循就近原则,如果想访问外部类的成员,则可以使用
 * 外部类名.静态成员  这里不能写成：外部类名.this.静态成员
 */
//外部其他类
public class StaticInnerClass {
    public static void main(String[] args) {
        //外部其他类,间接访问静态内部类中的方法
        System.out.println("-----------------------------");
        Outer4 outer4 = new Outer4();
        outer4.useInner4say();
        //6.外部其他类,直接访问静态内部类
        //方式一：
        System.out.println("-----------------------------");
        Outer4.Inner4 inner4 = new Outer4.Inner4();
        inner4.say();
        //方式二：
        System.out.println("-----------------------------");
        Outer4.Inner4 inner44 = Outer4.getInner4Instance();
        inner44.say();
    }
}
//外部类
class Outer4{
    private int num;

    private static String name = "张三";
    //静态内部类
    public static class Inner4{
        private String name = "李四";
        public void say(){
            //System.out.println("num:"+num); //报错,不能访问非static成员
            System.out.println("name:"+name);//name:李四
            System.out.println("name:"+Outer4.name);//name:张三
        }
    }
    //调用静态内部类中的方法
    public void useInner4say(){
        Inner4 inner4 = new Inner4();
        inner4.say();
    }
    //方式二
    public static Inner4 getInner4Instance(){
        return new Inner4();
    }
}